package com.sl.dynamic_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * author： suliang
 * 2023/1/4 17:32
 * describe : 代理处理器，并不是真实的代理类，而是用于代理类需要扩展、增强哪些方法的类。在invoke函数中，对代理对象的所有方法调用都被转发至该函数处理
 */
public class SubjectInvocationHandler implements InvocationHandler {

    //定义代理对象： 封装为Object 可以接收任意类型的对象，也是动态代理的好处
    private Object subject ;
    //构造方法，给我们要代理的真实对象赋值
    public SubjectInvocationHandler( Object subject){
        this.subject = subject ;
    }

    /**
     * 这个方法不是我们显示的调用，而是在
     * @param o
     * @param method  需要执行的方法
     * @param args  执行方法需要的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        //在代理真实对象前可以添加一些自己的操作
        System.out.println("SubjectInvocationHandler invoke method before");
        System.out.println("Method : " + method);
        //当代理对象调用真实对象的方法时，会自动跳转到代理对象关联的handler对象的invoke方法来进行调用
        Object invoke = method.invoke(subject, args);
        System.out.println("SubjectInvocationHandler invoke method after");
        return invoke;
    }


}
